// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database();
/*
云函数名称：支付成功回调函数(orderId)

基本步骤：
      1.将临时订单信息转正式订单信息
      2.删除临时订单信息
      3.通知打印
微信回调传递的参数格式：(开发时一定考虑，微信回调多次的情况！)

返回格式: {result:success/fail, error:'错误说明',more:''}
*/

function response(json){
  console.log(json)
  return json
}

exports.main = async (event, context) => {
  

  console.log(event)
  var condition = event.returnCode && event.resultCode && event.returnCode === 'SUCCESS' && event.resultCode ==='SUCCESS'
  if (!condition){
    return response({ "errcode": 1 , "errmsg": `这不是一个支付成功的回调！${event.returnCode}, ${event.resultCode}`})
  }
  // 获取回调中的【订单号】
  var orderId = event.outTradeNo

  // ********************【1. 临时订单信息转正式订单信息】********************
  let tempOrderSelect = await db.collection('temp_orders').where({ orderId: orderId }).get()
  //------------- 错误检测-err01：数据库访问是否正常
  if (tempOrderSelect.errMsg != 'collection.get:ok') {
    return response({ "errcode": 2 , "errmsg": `在temp_orders执行查询orderId:${orderId}失败！`})
  }
  //------------- 错误检测-err02：临时订单是否获取正常
  let tempOrder = tempOrderSelect.data[0]  // 获取临时订单信息
  if (!tempOrder) {
    // 如果未找到临时订单：1.该订单已经被 payCallBack函数释放掉 2.该订单未生成临时订单或者已经被删除（极微概率发生）
    return response({ "errcode": 0 , "errmsg": `orderId:${orderId}已经被释放为正式订单！`})
  }

  // 1.1 生成订单取餐号
  let orderDate = tempOrder.orderDate
  let todayOrdersCount = await db.collection('orders').where({ orderDate: orderDate }).count()
  //------------- 错误检测-err03：当日订单总数获取是否正常
  if (todayOrdersCount.errMsg != 'collection.count:ok') {
    return response({ "errcode": 3 , "errmsg": `数据库网络错误：获取【${orderDate}】日的订单总数量失败！`})
  }
  let simpleId = todayOrdersCount.total + 1;
  tempOrder.oneDayId = simpleId
  tempOrder.simpleId = ('0000' + simpleId).substr(-4)

  // 1.2 将支付方式修改为：微信支付
  tempOrder.payType = '微信支付'

  // 1.3 将修正后的订单信息 写入表 orders
  let orderInfoAdd = await db.collection('orders').add({ data: tempOrder })
  //------------- 错误检测-err04：订单信息写入 orders 是否正常
  if (orderInfoAdd.errMsg != 'collection.add:ok') {
    return response({ "errcode": 4 , "errmsg": `数据库网络错误：临时订单【${orderId}】写入表orders失败！`})
  }

  // // ********************【2. 删除临时订单信息】********************
  let tempOrderRemove = await db.collection('temp_orders').where({ orderId: orderId }).remove()
  //------------- 错误检测-err04：临时订单信息删除是否正常
  if (tempOrderRemove.errMsg != 'collection.remove:ok') {
    return response({ "errcode": 5 , "errmsg": `数据库网络错误：临时订单【${orderId}】删除失败！`})
  }

  // ********************【3. 通知打印 】********************
  let printer = await cloud.callFunction({
    // 要调用的云函数名称
    name: 'printOrder',
    // 传递给云函数的参数
    data: {
      orderId: orderId
    }
  })
  //------------- 错误检测-err05：小票打印云函数运行是否正常
  if (printer.errMsg != 'callFunction:ok') {
    return response({ "errcode": 6 , "errmsg": `网络错误：订单【${orderId}】小票打印任务下发失败！`})
  }
  //------------- 错误检测-err06：小票打印执行是否正常
  if (printer.result.result != 'success') {
    return response({ "errcode": 7 , "errmsg": `【printOrder】云函数返回异常：${JSON.stringify(printer.result)}！`})
  }

  // // ********************【运行至此说明所有操作无误】********************
  return response( { "errcode": 0 , "errmsg": `订单号【${orderId}】回调处理成功！`})
}